﻿using System;

namespace Segmentation.Business.Criterions
{
    public class NoiseproofFeature : Criterion
    {
        #region Properties

        public override string Name
        {
            get
            {
                return "Noiseproof Feature";
            }
        }

        #endregion

        #region Methods

        protected override double Calculate(byte[,] mapIdeal, byte[,] mapCalculated)
        {
            int height = mapIdeal.GetLength(0);
            int width = mapIdeal.GetLength(1);

            double R = 0;

            // масштабный множитель
            double a = 1;// 1.0 / 9.0;            

            int Ia = 0;
            int Ii = 0;

            for (int y = 0; y < height; y++)
            {
                int xContourCalculated = -1;
                int xContourIdeal = -1;
                for (int x = 0; x < width - 1; x++)
                {
                    if (mapCalculated[y, x] != mapCalculated[y, x + 1])
                    {
                        xContourCalculated = x;
                        Ia++;
                    }
                    if (mapIdeal[y, x] != mapIdeal[y, x + 1])
                    {
                        xContourIdeal = x;
                        Ii++;
                    }
                }
                // расстояние между реальной границей сегмента и идеального сегмента
                double d = xContourCalculated - xContourIdeal;
                R += 1.0 / (1.0 + a * d * d);
            }

            // нормализуем значение критерия Прета
            int I = (Ii > Ia) ? Ii : Ia;
            return R / I;
        }

        #endregion
    }
}
